// 版本id
#define FFCONF_DEF	80286

/*---------------------------------------------------------------------------/
/ 函数功能配置
/---------------------------------------------------------------------------*/
// 读写读模式  0:可读 可写 1:只读
// 只读模式下: 部分函数无法使用 f_write(), f_sync(), f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() 等
#define FF_FS_READONLY	0

// 功能：决定是否移除 FATFS 的部分基础功能函数，以减少代码体积（适用于资源受限的嵌入式系统）。
// 可选值：
//       0：默认值，启用所有基础功能（推荐用于大多数场景）。
//       1：移除部分文件操作函数（如删除、创建目录等）。
//       2：在 1 的基础上，进一步移除目录操作函数（如打开目录、读取目录等）。
//       3：在 2 的基础上，移除文件定位函数 f_lseek()。
#define FF_FS_MINIMIZE	0

// 功能：控制是否启用文件查找功能，允许通过通配符（如* .txt）筛选目录中的文件或目录。
// 可选值：
// 0：禁用文件查找功能，移除 f_findfirst() 和 f_findnext() 函数。
// 1：启用文件查找功能（基础模式），支持通配符匹配文件名（不匹配短文件名 altname）。
// 2：增强模式，除了匹配长文件名外，还支持匹配 8.3 格式的短文件名（altname）。
#define FF_USE_FIND		1

// 控制是否包含文件系统格式化函数 f_mkfs()，用于在存储设备上创建 FAT 文件系统（如 FAT16、FAT32）。
// 可选值：
// 0：禁用格式化功能，移除 f_mkfs() 函数。
// 1：启用格式化功能（推荐），允许通过代码对存储设备进行分区和格式化。
// FF_USE_MKFS 会增加约 2~4 KB 的代码体积，需确保目标芯片有足够 Flash 空间。
#define FF_USE_MKFS		1   // modify

// 定义宏启用快速定位功能
// 在文件系统（File System）相关的代码中，“快速定位” 可能指跳过某些冗余检查或直接访问文件元数据，以加速文件查找、跳转或读写操作（如通过文件描述符直接定位到指定位置）。
//(0:Disable or 1:Enable)
#define FF_USE_FASTSEEK	1  // modify

/*
 *
 *  控制是否启用 路径扩展（Path Expansion） 功能   (0:Disable or 1:Enable)
 *  当启用时，支持通过 f_expand() 函数将包含通配符的路径扩展为实际存在的文件或目录路径。
 *  使用场景:
 *          1.动态文件查找
 *              // 查找第一个配置文件（如 config1.ini, config2.ini 等）
 *             res = f_expand("config?.ini", expanded_path, sizeof(expanded_path));
 *             if (res == FR_OK) {
 *                 printf("找到配置文件: %s\n", expanded_path);
 *                 // 打开并处理文件...}
 *         2.循环扩展所有匹配的日志文件
 *            res = f_expand("logs *.log", expanded_path, sizeof(expanded_path));
 *            while (res == FR_OK) {
 *                  printf("处理文件: %s\n", expanded_path);
 *                  // 继续查找下一个匹配文件
 *                  res = f_expand(pattern, expanded_path, sizeof(expanded_path));}
 * 依赖条件：
 *     必须启用长文件名支持（FF_USE_LFN >= 1）。
 *     需确保文件系统已正确挂载
 */
#define FF_USE_EXPAND	0


/*
*
*  控制是否启用 文件权限和时间戳管理 功能  (0:Disable or 1:Enable)
*  当启用时 该功能允许修改文件的属性（如只读、隐藏）和时间戳（创建 / 修改时间）
*  使用场景:
*          1.文件保护 设置配置文件为只读，防止意外修改
*            f_chmod("config.ini", AM_RDO, AM_RDO);
*          2.日志文件管理 更新日志文件的修改时间为当前时间
*           FILINFO fno;
*           fno.fdate = get_fattime() >> 16;
*           fno.ftime = get_fattime() & 0xFFFF;
*           f_utime("system.log", &fno);
*      依赖条件：
*          必须禁用只读模式（FF_FS_READONLY = 0）。
*          若需使用时间戳，需实现 get_fattime() 函数（或通过 FF_FS_NORTC 使用固定时间）。
*/
#define FF_USE_CHMOD	0


/*
 *
 *  控制是否启用 卷标（Volume Label） 管理功能  (0:Disable or 1:Enable)
 *  当启用时，支持通过 f_getlabel() 和 f_setlabel() 函数获取或设置存储设备的卷标
 *  使用场景:
 *          1.检查存储设备卷标，判断是否为预期设备
 *              f_getlabel("0:", label, NULL);
 *             if (strcmp(label, "MY_LOGGER") == 0) {
 *             // 执行特定操作
 *             }
 *         2.初始化配置  首次挂载时设置卷标
 *           if (f_getlabel("0:", label, NULL) != FR_OK || strlen(label) == 0) {
 *              f_setlabel("STM32_STORAGE");
 *           }
 */
#define FF_USE_LABEL	1     // modify




/*
  *
  *  于控制是否启用数据转发（Data Forwarding）功能  (0:Disable or 1:Enable)
  *  该功能允许将文件数据直接从存储设备传输到输出流（如串口、网络），而无需通过应用层缓冲区，从而优化数据传输效率
  *  背景知识:
  *         在挂载文件系统时 使用
  *         static FATFS fatfs;
  *         res = f_mount(&fatfs, DEV_PATH_STR, 1); 这个时候会在内存开辟一个扇区的内存
  *         写入文件时,会先写到这个内存中,在到存储设备中
  *         读取文件时,会先读到这个内存中,在到指定的储存区域
  *  性能优化:
  *        传统方式：
  *              数据流向: 存储设备 → disk_read() → FATFS 缓存 → 用户缓冲区。
  *        数据转发：
  *               文件 → disk_forward->输出流（无需应用层缓冲区，节省 RAM）。
  * 依赖条件：
  *     需实现底层驱动函数 disk_forward()（在 diskio.c 中）。
  *
  * 核心函数: FRESULT f_forward (
  *                             FIL* fp,                          // 已打开的文件句柄
  *                             UINT (*func)(const BYTE*, UINT),  // 输出回调函数
  *                             UINT bsize,                       // 每次转发的字节数
  *                             UINT* bw                          // 实际转发的字节数
  *                      );
  *           UINT callback(const BYTE* buffer, UINT btr);
  *            buffer：数据缓冲区指针  btr：待传输的字节数  返回值：实际处理的字节数
  *  使用场景:
  *          1.流媒体播放  直接将音频 / 视频文件内容转发到解码器，减少内存占用。
  *           https://elm-chan.org/fsw/ff/doc/forward.html
  *           注意:
  *               1.整个的执行流程:
  *                   应用层调用 play_file() → 打开文件 → 进入循环 → 调用 f_forward() → FATFS内核执行：
  *                       1. 读取文件内容到内部缓冲区
  *                       2. 调用 out_stream(NULL, 0) 检查设备状态（感知调用）
  *                       ├─ 若返回0：设备忙碌 → 等待并重试
  *                       └─ 若返回1：设备就绪 → 执行3
  *                       3. 调用 out_stream(buffer, btf) 传输数据（传输调用）
  *                       4. 更新文件指针，重复1-3直到文件结束
  *              2.感知调用的必要性
  *                  输出设备（如 UART、SPI、音频 DAC）通常有有限大小的缓冲区（如 FIFO）。若缓冲区已满，继续写入会导致数据丢失
  *                  文件读取速度（生产者）与设备处理速度（消费者）可能不匹配。例如：音频文件可能以固定速率（如 44.1kHz）播放，但 FATFS 读取文件的速度可能更快。网络发送时，网络带宽可能低于文件读取速度
  */
#define FF_USE_FORWARD	0

/*
 *
 *  用于控制是否启用 字符串输入 / 输出函数   可选值: 0 1 2
 *  0: 禁用字符串函数（默认）
 *  1: 启用字符串函数，无换行符转换
 *  2: 启用字符串函数，自动转换换行符（LF→CR+LF）
 *  注意:    字符串函数: f_gets() f_putc() f_puts() f_printf()
 *          自动转换换行符: 写入时：将 \n（LF）转换为 \r\n（CR+LF）。
 *                         读取时：将 \r\n 转换回 \n。
 *          不进行换行符转换，直接读写原始数据（如文件中的 \n 保持不变）。
 *          启用 FF_USE_STRFUNC 会增加约 3~5 KB 的代码体积
 */
#define FF_USE_STRFUNC	1     // modify 



/*
*
* 控制启用 64 位整数（long long）格式化输出功能
*当启用时，f_printf() 函数支持以下格式说明符：
*     %lld：有符号 64 位整数（long long）。
*     %llu：无符号 64 位整数（unsigned long long）。
*     %llX/%llx：无符号 64 位整数（十六进制）。
*依赖条件：
*         必须先启用 FF_USE_STRFUNC >= 1（字符串函数支持）。
*         编译器需支持 long long 类型（通常为 C99 或更高标准）。
*使用场景: 通过启用 FF_PRINT_LLI，可简化大数值的格式化输出，但需权衡代码体积与实际需求。在资源受限的系统中，若无需处理超过 32 位的数值，建议禁用此功能以减少内存占用。
*/
#define FF_PRINT_LLI	1

/*
*
* 控制是否启用浮点数（float/double）格式化输出功能
*  0: 禁用浮点数支持（默认） 1:  启用浮点数支持（单精度） 2: 启用双精度浮点数支持（`double`）
*  当启用时，f_printf() 函数支持以下格式说明符：
*   %f：十进制浮点数（如 3.1415）。
*   %e：科学计数法（如 3.14e+00）。
*   %g：自动选择 %f 或 %e（去除无效零）。
* 依赖条件：
*         必须先启用 FF_USE_STRFUNC >= 1（字符串函数支持）。
*         编译器需支持 long long 类型（通常为 C99 或更高标准）
* 使用场景:
*      // 单精度浮点数（%f）
*      f_printf(&file, "温度: %.2f °C\n", temperature);
*      // 双精度浮点数（%lf，需 FF_PRINT_FLOAT=2）
*      f_printf(&file, "气压: %.1lf hPa\n", pressure);
*/
#define FF_PRINT_FLOAT	1



/*
* 控制文件名和路径的字符串编码转换方式
*      0: 禁用编码转换（仅支持 ASCII）
*      1: 启用 ANSI/OEM 编码与 UTF-16 的双向转换
*      2: 启用 UTF-8 编码与 UTF-16 的双向转换
*      3: 支持所有三种编码（ANSI/OEM、UTF-8、UTF-16，自动检测）
*背景知识:
*    FatFs 内核使用 UTF-16：FatFs 内部用 UTF-16 编码处理所有文件名和路径
*   从用户程序接收文件名或路径字符串 → 转换为 UTF-16 → 传递给 FatFs 内核
*   从 FatFs 内核接收 UTF-16     → 转换为 对应的格式 → 传递给用户程序
*当配置为0时: 支持ASCII->UTF-16
*    文件名或路径中只能是ASCII字符
*当配置为1时: 支持ASCII/OEM->UTF-16
*       OEM: 本地字符集编码（如中文 GBK、日文 Shift-JIS）
*当配置为2时: 支持UTF-8->UTF-16
*当配置为3时: 自动检测编码
*  自动检测输入字符串的编码（ANSI/OEM、UTF-8、UTF-16）转换为 UTF-16
*  当检测到不是 ANSI  UTF-8  UTF-16 那么就使用FF_CODE_PAGE定义的编码方式转换
*/
#define FF_STRF_ENCODE	3


/*---------------------------------------------------------------------------/
/ Locale and Namespace Configurations
/---------------------------------------------------------------------------*/
/*
*
* 配置本地字符集编码页，用于 ANSI/OEM 与 UTF-16 之间的编码转换
* 当 FF_STRF_ENCODE 设置为 1（ANSI/OEM 编码支持）时生效
* 常用编码页选项：
*   437: 美国/英语
*   936: 简体中文（GBK）
*   0: 使用系统默认 OEM 代码页
* 依赖条件：
*         必须先启用 FF_STRF_ENCODE = 1 或3  （ANSI/OEM 编码支持）
* 使用场景:
*      // 配置为简体中文 GBK 编码
*      #define FF_CODE_PAGE 936
*      // 打开一个包含中文的文件（使用 GBK 编码）
*      f_open(&file, "中文文档.txt", FA_READ);
*/
#define FF_CODE_PAGE	936 // modify



/*
*
* 控制长文件名（Long File Name, LFN）支持功能
*  0: 禁用长文件名支持（仅支持 8.3 格式短文件名，如 FILE.TXT）
*  1: 启用长文件名支持，使用栈上内存（不安全，不推荐，需确保栈空间足够）
*  2: 启用长文件名支持，使用堆内存（通过 ff_memalloc()/ff_memfree() 动态分配）
*  3: 启用长文件名支持，使用用户预分配的静态缓冲区（通过 ff_prealloc() 回调）
*背景知识:
*  短文件名:  主文件名不超过 8 个字符 扩展名不超过 3 个字符 仅支持 ASCII 字符
*  长文件名:  主文件名常见限制为 255 个字符 持 Unicode 字符集（包括中文、日文、 emoji 等），文件名可包含空格、特殊符号
*依赖条件：
*         必须定义 FF_LFN_BUF 指定 LFN 缓冲区大小（如 #define FF_LFN_BUF 255）
*         若处理非 ASCII 字符，需正确配置 FF_STRF_ENCODE 和 FF_CODE_PAGE
* 注意: 核心就是定义文件名的保存位置
*/
#define FF_USE_LFN		1  // modify





/*
*
* 配置长文件名（LFN）支持的最大长度（以 UTF-16 字符为单位）
*  该值决定了：
*   - 存储 LFN 所需的最大内存空间
*   - 允许的最长文件名长度（包括路径）
* 合法取值范围：
*   12: 最小支持长度（基本功能）
*   255: 标准 Windows 兼容长度（推荐值）
*   1024: 扩展支持超长文件名（需更大内存）
* 依赖条件：
*         必须先启用 FF_USE_LFN >= 1（长文件名功能）
*         实际缓冲区大小由 FF_LFN_BUF 决定，需满足 FF_LFN_BUF >= FF_MAX_LFN
*/

#define FF_MAX_LFN		255



/*
 *
 *  控制写入文件系统时的编码格式（决定如何从 UTF-16 转为存储编码）
 *  0: LFN 使用 ANSI/OEM 编码（由 FF_CODE_PAGE 指定）
 *  1: LFN 使用 UTF-16 编码（Little Endian，无 BOM）
 *  2: LFN 使用 UTF-16BE 编码（Big Endian，无 BOM）
 *  3: LFN 使用 UTF-8 编码
 *
 */

#define FF_LFN_UNICODE	0


/*
*
* 配置长文件名（LFN）处理时的缓冲区大小（以 UTF-16 字符为单位）
* 该值决定了：
*   - 存储单个 LFN 所需的最大内存空间
*   - 允许的最长文件名长度（包括路径）
* 合法取值范围：
*   12: 最小支持长度（基本功能，不推荐）
*   255: 标准 Windows 兼容长度（推荐值）
*   1024+: 扩展支持超长文件名（需更大内存）
* 依赖条件：
*         必须先启用 FF_USE_LFN >= 1（长文件名功能）
*         需满足 FF_LFN_BUF >= FF_MAX_LFN（通常设为相同值）
*/

#define FF_LFN_BUF		255

/**
     * 配置短文件名（SFN）处理时的缓冲区大小（以字节为单位）
     * 该值决定了：
     *   - 存储 8.3 格式短文件名所需的内存空间
     *   - 处理短文件名相关操作的临时缓冲区大小
     * 合法取值范围：
     *   12: 刚好存储完整 8.3 格式（8 字符主名 + 1 点 + 3 字符扩展名 + 1 终止符）
     *   13-16: 预留额外空间（推荐值，防止边界溢出）
     * 依赖条件：
     *         必须先启用 FF_USE_SFN = 1（短文件名功能）
     */

#define FF_SFN_BUF		12

/**
 * 配置文件系统（FATFS）的相对路径功能相关参数
 * 功能说明：
 *   - 控制是否启用相对路径解析（如 "./subdir/file.txt" 或 "../file.txt"）
 *   - 影响 f_open/f_stat 等函数对相对路径的支持
 * 合法取值：
 *   0: 禁用相对路径功能（仅支持绝对路径，如 "0:/dir/file.txt"）
 *   1: 启用相对路径功能（支持基于当前工作目录的相对路径）
 */

#define FF_FS_RPATH		0


/**
 * 配置文件系统支持的物理驱动器（卷）数量
 * 取值范围：
 *   1-10: 支持的驱动器数量（如 1 表示仅支持 0: 驱动器，2 表示支持 0: 和 1:）
 * 依赖条件：
 *         无强制依赖，但需确保 disk_initialize() 等底层磁盘 I/O 函数支持对应数量的驱动器
 * 使用场景:
 *      // 支持两个物理驱动器（如 SD 卡和内置 Flash）
 *      #define FF_VOLUMES 2
 *      // 初始化并挂载不同驱动器
 *      disk_initialize(0);  // 初始化驱动器 0
 *      disk_initialize(1);  // 初始化驱动器 1
 *      f_mount(&fs, "0:", 1);  // 挂载驱动器 0
 *      f_mount(&fs1, "1:", 1); // 挂载驱动器 1
 * 注意事项：
 *   - 每个驱动器需要独立的 FATFS 对象实例（如上面的 &fs 和 &fs1）
 *   - 增加驱动器数量会占用更多 RAM（每个驱动器约需 100-200 字节）
 */

#define FF_VOLUMES		3


#define FF_STR_VOLUME_ID	1
#define FF_VOLUME_STRS		"C","D","E"
/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings.
/  When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive
/  number in the path name. FF_VOLUME_STRS defines the volume ID strings for each
/  logical drives. Number of items must not be less than FF_VOLUMES. Valid
/  characters for the volume ID strings are A-Z, a-z and 0-9, however, they are
/  compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is
/  not defined, a user defined volume string table is needed as:
/
/  const char* VolumeStr[FF_VOLUMES] = {"ram","flash","sd","usb",...
*/


#define FF_MULTI_PARTITION	0
/* This option switches support for multiple volumes on the physical drive.
/  By default (0), each logical drive number is bound to the same physical drive
/  number and only an FAT volume found on the physical drive will be mounted.
/  When this function is enabled (1), each logical drive number can be bound to
/  arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk()
/  function will be available. */


#define FF_MIN_SS		512
#define FF_MAX_SS		4096  //modify
/* This set of options configures the range of sector size to be supported. (512,
/  1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and
/  harddisk, but a larger value may be required for on-board flash memory and some
/  type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured
/  for variable sector size mode and disk_ioctl() function needs to implement
/  GET_SECTOR_SIZE command. */


#define FF_LBA64		0
/* This option switches support for 64-bit LBA. (0:Disable or 1:Enable)
/  To enable the 64-bit LBA, also exFAT needs to be enabled. (FF_FS_EXFAT == 1) */


#define FF_MIN_GPT		0x10000000
/* Minimum number of sectors to switch GPT as partitioning format in f_mkfs and
/  f_fdisk function. 0x100000000 max. This option has no effect when FF_LBA64 == 0. */


#define FF_USE_TRIM		0
/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable)
/  To enable Trim function, also CTRL_TRIM command should be implemented to the
/  disk_ioctl() function. */



/*---------------------------------------------------------------------------/
/ System Configurations
/---------------------------------------------------------------------------*/

#define FF_FS_TINY		1
/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
/  At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.
/  Instead of private sector buffer eliminated from the file object, common sector
/  buffer in the filesystem object (FATFS) is used for the file data transfer. */


#define FF_FS_EXFAT		0
/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable)
/  To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1)
/  Note that enabling exFAT discards ANSI C (C89) compatibility. */


#define FF_FS_NORTC		0
#define FF_NORTC_MON	1
#define FF_NORTC_MDAY	1
#define FF_NORTC_YEAR	2022
/* The option FF_FS_NORTC switches timestamp feature. If the system does not have
/  an RTC or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable the
/  timestamp feature. Every object modified by FatFs will have a fixed timestamp
/  defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time.
/  To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be
/  added to the project to read current time form real-time clock. FF_NORTC_MON,
/  FF_NORTC_MDAY and FF_NORTC_YEAR have no effect.
/  These options have no effect in read-only configuration (FF_FS_READONLY = 1). */


#define FF_FS_NOFSINFO	0
/* If you need to know correct free space on the FAT32 volume, set bit 0 of this
/  option, and f_getfree() function at the first time after volume mount will force
/  a full FAT scan. Bit 1 controls the use of last allocated cluster number.
/
/  bit0=0: Use free cluster count in the FSINFO if available.
/  bit0=1: Do not trust free cluster count in the FSINFO.
/  bit1=0: Use last allocated cluster number in the FSINFO if available.
/  bit1=1: Do not trust last allocated cluster number in the FSINFO.
*/


#define FF_FS_LOCK		0
/* The option FF_FS_LOCK switches file lock function to control duplicated file open
/  and illegal operation to open objects. This option must be 0 when FF_FS_READONLY
/  is 1.
/
/  0:  Disable file lock function. To avoid volume corruption, application program
/      should avoid illegal open, remove and rename to the open objects.
/  >0: Enable file lock function. The value defines how many files/sub-directories
/      can be opened simultaneously under file lock control. Note that the file
/      lock control is independent of re-entrancy. */


#define FF_FS_REENTRANT	0
#define FF_FS_TIMEOUT	1000
/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs
/  module itself. Note that regardless of this option, file access to different
/  volume is always re-entrant and volume control functions, f_mount(), f_mkfs()
/  and f_fdisk() function, are always not re-entrant. Only file/directory access
/  to the same volume is under control of this featuer.
/
/   0: Disable re-entrancy. FF_FS_TIMEOUT have no effect.
/   1: Enable re-entrancy. Also user provided synchronization handlers,
/      ff_mutex_create(), ff_mutex_delete(), ff_mutex_take() and ff_mutex_give()
/      function, must be added to the project. Samples are available in ffsystem.c.
/
/  The FF_FS_TIMEOUT defines timeout period in unit of O/S time tick.
*/



/*--- End of configuration options ---*/
